/**
 * 给定一堆字符串，要求连接成一个长字符串且字典序最小
 * 该目标具有传递性，即三个字符串 a/b/c
 * 如果 ab < ba， 则a应该排在b的前面
 * 如果 bc < cb， 则b应该排在c的前面
 * 此时可以肯定 ac < ca，即a必然要排在c的前面
 * 因此可以使用排序完成。
 * 题目提示输入量巨大，可达到2E7的字符数量，因此使用了快读
 * 使用stable_sort可以在1200ms完成，改用sort达到了1400ms
 * 使用字典树和z算法可以达到线性时间。
 */
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

namespace IO{

char *__abc147, *__xyz258, __ma369[1000000];
#define __hv007() ((__abc147==__xyz258) && (__xyz258=(__abc147=__ma369)+fread(__ma369,1,100000,stdin),__abc147==__xyz258) ? EOF : *__abc147++)

int getInt(){
	int sgn = 1;
	char ch = __hv007();
	while( ch != '-' && ( ch < '0' || ch > '9' ) ) ch = __hv007();
	if ( '-' == ch ) {sgn = 0;ch=__hv007();}
 
	int ret = (int)(ch-'0');
	while( '0' <= (ch=__hv007()) && ch <= '9' ) ret = ret * 10 + (int)(ch-'0');
	return sgn ? ret : -ret;
}

char getChar(){
    char ch = __hv007();
    while(!isdigit(ch)) ch = __hv007();
    return ch;
}

int getString(char s[]){
    char * p = s;
    *p++ = getChar();
    for(char ch=__hv007();isdigit(ch);ch=__hv007()) *p++ = ch;
    return p - s;    
}

}

#ifndef ONLINE_JUDGE
int const SZ = 120;
#else
int const SZ = 2E6+100;
#endif

using pii = pair<int, int>;

int N;
pii Idx[SZ];
char S[SZ*10];

int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    N = IO::getInt();
    int offset = 0;
    for(int i=0;i<N;++i){
        offset += Idx[i].second = IO::getString(S + (Idx[i].first = offset));     
    }
    stable_sort(Idx, Idx + N, [&](const pii & a, const pii & b){
        int sa = a.first, sb = b.first;
        int ka = 0, kb = 0;
        while(1){
            if(S[sa] != S[sb]) return S[sa] < S[sb];
            ++ka, ++kb;
            ++sa, ++sb;
            if(ka == a.second){
                if(kb == b.second){
                    break;
                }else{
                    sa = b.first;
                }
            }else{
                if(kb == b.second){
                    sb = a.first;
                }else{
                    ;
                }
            }
        }
        return false;
    });
    for(int i=0;i<N;++i){
        const auto & p = Idx[i];
        for(int j=p.first,k=0;k<p.second;++j,++k) putchar(S[j]);
    }
    puts("");
    return 0;
}